const cloud = require('wx-server-sdk');
// 初始化云开发
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});

// 银行名称到编码的映射
const bankCodeMap = {
  '工商银行': 'ICBC',
  '中国工商银行': 'ICBC',
  '建设银行': 'CCB',
  '中国建设银行': 'CCB',
  '中国银行': 'BOC',
  '农业银行': 'ABC',
  '中国农业银行': 'ABC',
  '交通银行': 'BOCOM',
  '招商银行': 'CMB',
  '浦发银行': 'SPDB',
  '中信银行': 'CITIC',
  '光大银行': 'CEB',
  '华夏银行': 'HXB',
  '民生银行': 'CMBC',
  '广发银行': 'GDB',
  '平安银行': 'PAB',
  '兴业银行': 'CIB',
  '邮储银行': 'PSBC',
  '中国邮政储蓄银行': 'PSBC'
};

/**
 * 解析银行编码
 */
function parseBankCode(bankName) {
  if (!bankName) return 'OTHER';
  
  // 遍历映射表，查找匹配的银行名称
  for (const [name, code] of Object.entries(bankCodeMap)) {
    if (bankName.includes(name) || name.includes(bankName)) {
      return code;
    }
  }
  
  return 'OTHER';
}

/**
 * 云函数主入口
 */
exports.main = async (event, context) => {
  const { filePath } = event;
  
  console.log('收到OCR识别请求，文件ID:', filePath);
  try {
    // 1. 从云存储下载文件并转换为base64
    let imageBase64;
    
    if (!filePath || !filePath.startsWith('cloud://')) {
      throw new Error('无效的文件ID，请先上传图片到云存储');
    }
    
    // 下载云存储文件
    console.log('开始下载云存储文件...');
    const fileContent = await cloud.downloadFile({
      fileID: filePath
    });
    
    if (!fileContent || !fileContent.fileContent) {
      console.error('云存储返回为空:', fileContent);
      throw new Error('从云存储下载图片失败，请重试');
    }
    
    let fileBuffer;
    const rawContent = fileContent.fileContent;
    
    const contentType =
      rawContent && rawContent.constructor ? rawContent.constructor.name : typeof rawContent;
    console.log('文件下载成功，类型:', contentType);
    
    if (Buffer.isBuffer(rawContent)) {
      fileBuffer = rawContent;
    } else if (typeof ArrayBuffer !== 'undefined' && rawContent instanceof ArrayBuffer) {
      fileBuffer = Buffer.from(new Uint8Array(rawContent));
    } else if (rawContent && rawContent.data) {
      // 兼容云函数返回 {data: ArrayBuffer}
      fileBuffer = Buffer.from(rawContent.data);
    } else {
      console.error('无法识别的文件内容类型:', typeof rawContent, rawContent);
      throw new Error('图片数据格式不受支持，请重新上传');
    }
    
    // 将文件内容转换为base64
    imageBase64 = fileBuffer.toString('base64');
    
    console.log('图片下载成功，大小:', imageBase64.length);
    
    // 2. 调用云调用 OCR
    console.log('调用云调用 OCR 接口...');
    const response = await cloud.openapi.ocr.bankcard({
      type: 'BANKCARD',
      imgBase64: imageBase64
    });
    console.log('OCR识别结果:', response);
    
    // 4. 解析识别结果
    const cardNumber = response.cardNo || response.CardNo || '';
    const bankName = response.bankInfo || response.BankInfo || '';
    const bankCode = parseBankCode(bankName);
    
    const result = {
      cardNumber: cardNumber.replace(/\s/g, ''),  // 移除空格
      bankName: bankName,
      bankCode: bankCode
    };
    
    return {
      code: 200,
      msg: '识别成功',
      data: result
    };
    
  } catch (error) {
    console.error('OCR识别失败:', error);
    
    return {
      code: 500,
      msg: error.message || '识别失败',
      data: null
    };
  }
};

